#include <stdint.h>
#include "stm32f4xx_hal.h"

typedef struct
{
	GPIO_TypeDef *gpio;
	uint16_t pin;
	GPIO_PinState level;
} Led_GPIO_t;

static Led_GPIO_t g_gpioList[] =
{
	{GPIOB, GPIO_PIN_0, GPIO_PIN_SET},
	{GPIOB, GPIO_PIN_1, GPIO_PIN_SET},
};

#define LED_NUM_MAX (sizeof(g_gpioList) / sizeof(g_gpioList[0]))

/**
***********************************************************
* @brief LED硬件初始化
* @param
* @return 
***********************************************************
*/
void LedDrvInit(void)
{
	GPIO_InitTypeDef GPIO_Init = { 0 };
	
	// 时钟初始化
	__HAL_RCC_GPIOB_CLK_ENABLE();
	
	// 默认配置
	GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_Init.Pull = GPIO_NOPULL;
	GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW;
	
	for (uint8_t i = 0; i < LED_NUM_MAX; i++)
	{
		GPIO_Init.Pin = g_gpioList[i].pin; // 引脚配置	
		HAL_GPIO_Init((GPIO_TypeDef *)g_gpioList[i].gpio, &GPIO_Init); // 初始化
		HAL_GPIO_WritePin(g_gpioList[i].gpio, g_gpioList[i].pin, g_gpioList[i].level); // 初始电平 
	}
}

/**
***********************************************************
* @brief 点亮LED
* @param ledNo，LED标号，0~1
* @return 
***********************************************************
*/
void TurnOnLed(uint8_t ledNo)
{
	if (ledNo >= LED_NUM_MAX)
	{
		return;
	}
	HAL_GPIO_WritePin((GPIO_TypeDef *)g_gpioList[ledNo].gpio, g_gpioList[ledNo].pin, GPIO_PIN_RESET);
}

/**
***********************************************************
* @brief 熄灭LED
* @param ledNo，LED标号，0~1
* @return 
***********************************************************
*/
void TurnOffLed(uint8_t ledNo)
{
	if (ledNo >= LED_NUM_MAX)
	{
		return;
	}
	HAL_GPIO_WritePin(g_gpioList[ledNo].gpio, g_gpioList[ledNo].pin, GPIO_PIN_SET);
}

/**
***********************************************************
* @brief LED状态取反
* @param ledNo，LED标号，0~1
* @return 
***********************************************************
*/
void ToggleLed(uint8_t ledNo)
{
	if (ledNo >= LED_NUM_MAX)
	{
		return;
	}
	HAL_GPIO_TogglePin(g_gpioList[ledNo].gpio, g_gpioList[ledNo].pin);
}
